<?php
class TICE_Controlador_Login extends Zend_Controller_Action {

	public
		$tabela = 'usuarios',
		$campoUsuario = 'usuario',
		$campoSenha = 'senha',
		$tratamento = 'MD5(?) AND ativo = 1',
		$bdAdapter,
		$authAdapter,
		$urlLogado = 'admin';
	
	function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array() ) {
		parent::__construct($request, $response, $invokeArgs);
	}
	
	/**
	 * Inicializa o adaptadores
	 */
	protected function initAdapters() {
	
		if ($this->bdAdapter == null) {
			$this->bdAdapter = new Zend_Db_Table($this->tabela);
		}
		else {
			$info = $this->bdAdapter->info();
			$this->tabela = $info['name'];
		}
		if (empty($this->authAdapter)) {
			$this->authAdapter = new Zend_Auth_Adapter_DbTable($this->bdAdapter->getAdapter());
			$this->authAdapter
			    ->setTableName($this->tabela)
			    ->setIdentityColumn($this->campoUsuario)
			    ->setCredentialColumn($this->campoSenha)
			    ->setCredentialTreatment($this->tratamento);
			;
		}
		
	}
	/**
	 * Mostra o formulário de login
	 */
	function indexAction() {
		$req = $this->getRequest();
		$this->view->action = $this->view->baseUrl($req->getModuleName() . '/' . $req->getControllerName() . '/entra');
		$this->view->campoUsuario = $this->campoUsuario;
		$this->view->campoSenha = $this->campoSenha;
		
		$this->view->mensagem = implode('<br />', $this->_helper->FlashMessenger->getMessages());
	}
	/**
	 * Inicia a sessão
	 */
	function entraAction() {
		try {
			$this->initAdapters();
			
			$usuario = $this->_getParam($this->campoUsuario);
			$senha = $this->_getParam($this->campoSenha);
			
			$tratamento = $this->_getParam('naoTrataSenha');
			$tratamento = (empty($tratamento)) ? $this->tratamento : '';
			

			$adapter = $this->authAdapter;
			$adapter
			    ->setIdentity($usuario)
			    ->setCredential($senha)
			    ->setCredentialTreatment($tratamento)
			;

			// autentica com Zend_Auth_Adapter_DbTable
			$auth = Zend_Auth::getInstance();
			$resultado = $auth->authenticate($adapter);

			if ($resultado->isValid()) {
				$storage = $auth->getStorage();
				
				$this->postLogin($adapter->getResultRowObject());		 
			    // armazena na sessão todos os dados, menos a senha
			    $storage->write($adapter->getResultRowObject(
			        null,
			        $this->campoSenha
			    ));
			}
		}
		catch (Exception $resultado) {
			
			//$resultado = new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null, array($e->getMessage()));
		}
		return $this->resultado($resultado);
	}
	
	protected function resultado($resultado) {
		switch ($resultado->getCode()) {
		 
		    case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
		        $resultado = new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, null, array('Usuário não encontrado'));
		        break;
		 
		    case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
		        $resultado = new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, null, array('Aguardando Aprovação ou Usuário Suspenso.'));
		        break;
		 
		    case Zend_Auth_Result::SUCCESS:
		        /** do stuff for successful authentication **/
		        break;
		 
		    default:
		        $resultado = new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null, array('Informe seu Login e Senha.'));
		        break;
		}
		
		if ($resultado->isValid()) {
			$this->_redirect($this->urlLogado);
		}
		else {
			$this->_helper->FlashMessenger(implode('<br />', $resultado->getMessages()));
			$this->_helper->redirector('index');
		}
		return $resultado;
	}
	
	/**
	 * Encerra a sessão
	 */
	function saiAction() {
		$usuario = Zend_Auth::getInstance()->getIdentity();
		try {
			Zend_Auth::getInstance()->clearIdentity();			
			$this->postLogout($usuario);
		} catch (Exception $e) {}
		
		$this->_helper->FlashMessenger('Logout realizado com sucesso!');
		$this->_helper->redirector('index');
	}
	
	/**
	 * Apos o login efetuado com sucesso executa algo
	 * @param $usuario O objeto usuario logado
	 */
	protected function postLogin($usuario){
	}

	/**
	 * Apos o logout efetuado com sucesso executa algo
	 * @param $usuario O objeto usuario que estava logado
	 */
	protected function postLogout($usuario){
	}	
}